package com.android.support.lib.universal.util;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.widget.RemoteViews;

import java.util.HashMap;
import java.util.Map;

/**
 * 系统通知栏
 * 使用说明
 * 一：实例化
 * UtilNotification notification = new UtilNotification(this);
 * 二：发送消息（系统样式）
 * util.sendNotification//发送消息，详细参数见工具类
 * 三：发送消息（自定义布局）
 * util.sendNotificationView//发送消息，自定义View。详细参数见工具类
 * 四：根据通知ID,去除消息
 * util.cancelNoti(NotificationId);//发送消息的时候，会要求传人通知ID的，即通知ID是自己定义的。
 *
 * @author 彭治铭
 */
public class Utilnotification {
    NotificationManager manager;
    Context context;

    public Utilnotification(Context context) {
        super();
        this.context = context;
        manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

    }

    /**
     * 发送消息
     *
     * @param cls            通知要跳转的Activity
     * @param drawLeftId     下拉列表，最左边的图标
     * @param drawRightId    下拉列表最右边的图标(也是通知一开始所显示的提示图标,既状态栏图标)。必不可少，不然通知无反应！
     * @param NotificationId 通知ID
     * @param ticker         状态栏一开始提醒的信息
     * @param title          标题
     * @param content        提示信息正文
     * @param info           提示信息，出现在正文之后
     * @param isRemove       用户是否可以手动去除通知(true,可以手动划去通知，false,无法手动去除通知)
     */
    @SuppressLint("NewApi")
    public void sendNotification(Class<?> cls, int drawLeftId, int drawRightId, int NotificationId,
                                 String ticker, String title, String content, String info, Boolean isRemove) {
        Notification notification = new Notification();
        Intent notificationIntent = new Intent(context, cls);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        Builder builder = new Builder(context);
        builder.setContentIntent(pendingIntent);
        /**
         * setSmallIcon状态栏里的图标，下拉表里最右边的图标(也是通知一开始所显示的提示图标)。必不可少，不然通知无反应！
         */
        builder.setSmallIcon(drawRightId);
        /**
         * setLargeIcon下拉列表最左边的图标
         * setLargeIcon没有时，会被setSmallIcon替代，
         * 即最右边的图片会移动到最左边。
         */
        builder.setLargeIcon(BitmapFactory.decodeResource
                (context.getResources(), drawLeftId));//通知内容里的图片，下拉列表里左边的图片.
        builder.setWhen(System.currentTimeMillis());//设置时间
        builder.setTicker(ticker);//一开始通知时，所显示的文字。状态栏的文字
        builder.setContentTitle(title);
        builder.setContentText(content);
        builder.setContentInfo(info);
        notification = builder.build();
        if (!isRemove) {
            notification.flags = Notification.FLAG_NO_CLEAR;//用户无法清除
        }
        manager.notify(NotificationId, notification);
    }

    /**
     * 发送消息，自定义View
     *
     * @param cls            通知要跳转的Activity
     * @param drawRightId    下拉列表最右边的图标(也是通知一开始所显示的提示图标,既状态栏图标)。必不可少，不然通知无反应！
     * @param viewId         自定义布局ID
     * @param textId         自定义布局里的TextView Id
     * @param text           自定义布局里的TextView 里的内容
     * @param NotificationId 通知ID
     * @param isRemove       用户是否可以手动去除通知(true,可以手动划去通知，false,无法手动去除通知)
     */
    @SuppressLint("NewApi")
    public void sendNotificationView(Class<?> cls, int drawRightId, int viewId, int textId, String text, int NotificationId, Boolean isRemove) {
        Notification notification = new Notification();
        Intent notificationIntent = new Intent(context, cls);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        Builder builder = new Builder(context);
        builder.setContentIntent(pendingIntent);
        /**
         * setSmallIcon状态栏里的图标，下拉表里最右边的图标(也是通知一开始所显示的提示图标)。必不可少，不然通知无反应！
         */
        builder.setSmallIcon(drawRightId);
        /**
         * setContent自定义视图覆盖系统默认的，以上的设置都将无效
         */
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), viewId);
        remoteViews.setTextViewText(textId, text);//重写Text文本
        builder.setContent(remoteViews);

        notification = builder.build();
        if (!isRemove) {
            notification.flags = Notification.FLAG_NO_CLEAR;//用户无法清除
        }
        manager.notify(NotificationId, notification);
    }

    /**
     * 根据通知ID,去除消息
     */
    public void cancelNoti(int NotificationId) {
        manager.cancel(NotificationId);
    }

    @SuppressLint("NewApi")
    public void notification(Context context, Intent intent, int layoutId, int viewId, Bitmap bitmap, int resID) {
        //NotificationManager消息管理，用于发送通知和取消(去除)通知
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder builder = new Notification.Builder(context);
        //指定Intent,即指定点击时要跳转的Activty
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        builder.setContentIntent(pendingIntent);
        //自定义视图(和系统图片二选一)
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), layoutId);//参数一 包名， 参数二 自定义布局文件ID
        remoteViews.setTextViewText(viewId, "消息");//参数一 布局文件里的控件ID, 参数二 消息内容
        builder.setContent(remoteViews);
        //使用系统默认视图
        builder.setLargeIcon(bitmap);//下拉列表最左边的图标,setLargeIcon没有时，会被setSmallIcon替代，即最右边的图片会移动到最左边。
        builder.setContentTitle("标题");
        builder.setContentText("正文内容");
        builder.setContentInfo("提示信息，出现在正文之后");
        builder.setWhen(System.currentTimeMillis());//时间
        //以下是无论是使用自定义视图还是系统视图，都必不可少
        builder.setSmallIcon(resID);//参数 图片ID。下拉表里最右边的图标(也是通知一开始所显示的提示图标)。必不可少，不然通知无反应！
        builder.setTicker("一开始通知时，所显示的文字。状态栏的文字,即上面是提示图标，这个就是提示文字");
        //创建通知
        Notification notification = builder.build();
        notification.flags = Notification.FLAG_NO_CLEAR;//用户无法清除
        //发送通知
        int notificationId = 0;//通知ID,发送的通知如果ID相同会被覆盖。即取代已经存在的通知。
        notificationManager.notify(notificationId, notification);
        //取消(去除)通知
        notificationManager.cancel(notificationId);
        //保存已经发送的通知。以下进行数据更新
        Map<Integer, Notification> map = new HashMap<>();
        map.put(notificationId, notification);
        notification = map.get(notificationId);//获取保存的通知
        // 获取notification的RemoteViews布局
        remoteViews = notification.contentView;
        remoteViews.setTextViewText(viewId, "内容更新");
        // 进度条
        remoteViews.setProgressBar(viewId, 100, 10, false);//参数二 总进度max, 参数三 当前进度 progress,参数四 indeterminate
		// 按钮状态
		remoteViews.setImageViewResource(viewId, resID);
        //数据更新之后，需要重新发送通知。只要id不变。通知就会更新。
        notificationManager.notify(notificationId,notification);
        //notification不能对控件设置点击事件。但是可以设置点击广播。(以发送广播的方式代替点击事件)
        int broadCastID=1;//广播ID,也可以说是点击ID,如果添加多个点击事件。每个点击ID都不能相同。
        PendingIntent ClickPendingIntent = PendingIntent.getBroadcast(
                context,
                broadCastID, intent,//inetent指明了对应的广播
                PendingIntent.FLAG_UPDATE_CURRENT);// PendingIntent.FLAG_UPDATE_CURRENT 数据更新
        remoteViews.setOnClickPendingIntent(viewId, ClickPendingIntent);//点击时发送此Intent广播。
    }

}
